package com.qf.contorller;

import com.qf.util.Constants;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author LiXuekai on 2022/5/21
 */

public class BaseServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数（标识符 方法名）
        String methodSrt = req.getParameter(Constants.TAG);
        //2.如果没有获取到值  我们就跳转到首页
        if (methodSrt == null || "".equals(methodSrt)) {
            methodSrt = Constants.INDEX;
        }
        //3.反射 调用对应的逻辑方法 接受方法执行的结果
        Class clazz = this.getClass();

        //4从类中获取对象方法  接受方法的返回结果
        try {
            //需要获取的方法名字
            Method method = clazz.getMethod(methodSrt, HttpServletRequest.class, HttpServletResponse.class);
            //5.执行类中获取的对象方法  接受犯法执行结果
            Object result = method.invoke(this, req, resp);
            //6  根据返回的结果进行判断  判断返回值不能为空
            if (result != null) {
                String jump = (String) result;
                if (jump.startsWith(Constants.FORWARD)) {
                    //7.判断执行请求还是转发
                    //获取路径 比如 http://localhost/:8080/admin/admin/.jsp?
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);
                    //执行请求转发
                    req.getRequestDispatcher(path).forward(req, resp);

                } else if (jump.startsWith(Constants.REDIRECT)) {
                    //判断执行后值重定向处理
                    //获取路径  例如  http://localhost:8080/admin/admin/.jsp
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);
                    //执行重定向
                    resp.sendRedirect(path);
                } else {
                    //如果是其他类型  通过流写回到浏览器界面
                    resp.getWriter().println(jump);
                }
            }
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();


        }
    }

}